package redis.manage;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *
 * ClassName:redisService <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2019年9月3日 上午11:37:07 <br/>
 * @author   Owner
 * @version
 * @since    JDK 1.8
 * @see
 */
public interface RedisManager {
    /**
     * 写入缓存
     *
     * @param key
     * @param value
     * @return
     */
    boolean set(final String key, Object value);

    /**
     * 写入缓存设置时效时间
     *
     * @param key
     * @param value
     * @param expireTime
     * @return
     */
    boolean set(final String key, Object value, Long expireTime);

    /**
     * 批量删除对应的value
     *
     * @param keys
     */
    void remove(final String... keys);


    /**
     * 批量删除key
     *
     * @param pattern
     */
    void removePattern(final String pattern);

    /**
     * 删除对应的value
     *
     * @param key
     */
    void remove(final String key);

    /**
     * 判断缓存中是否有对应的value
     *
     * @param key
     * @return
     */
    boolean exists(final String key);


    /**
     * 读取缓存
     *
     * @param key
     * @return
     */
    <T> T get(final String key);

    /**
     * 哈希 添加
     *
     * @param key
     * @param hashKey
     * @param value
     */
    void hmSet(String key, Object hashKey, Object value);

    /**
     * 哈希 添加
     *
     * @param key
     * @param hashKey
     * @param value
     */
    void hmSet(String key, Object hashKey, Object value, Long expireTime);

    /**
     * 哈希获取数据
     *
     * @param key
     * @param hashKey
     * @return
     */
    Object hmGet(String key, Object hashKey);


    /**
     * 列表添加
     *
     * @param k
     * @param v
     */
    void lPush(String k, Object v);


    /**
     * 列表获取
     *
     * @param key
     * @param start
     * @param stop
     * @return
     */
    List<Object> lRange(String key, long start, long stop);


    /**
     * 集合添加
     *
     * @param key
     * @param value
     */
    void add(String key, Object value);

    /**
     * 集合获取
     *
     * @param key
     * @return
     */
    Set<Object> setMembers(String key);

    /**
     * 有序集合添加
     *
     * @param key
     * @param value
     * @param scoure 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
     */
    void zAdd(String key, Object value, double scoure);

    /**
     * 有序集合获取
     *
     * @param key
     * @param scoure
     * @param scoure1
     * @return
     */
    Set<Object> rangeByScore(String key, double scoure, double scoure1);


    /**
     * 遍历Key的所有hash key
     * hmMap:(这里用一句话描述这个方法的作用). <br/>
     * TODO(这里描述这个方法适用条件 – 可选).<br/>
     * @param key
     * @return
     * @author monxz
     * @time:2019年9月9日上午2:48:49
     * @since JDK 1.8
     */
    Map<Object, Object>  hmMap(String key);


    /**
     * 设置某一个简直自增
     * incr:(这里用一句话描述这个方法的作用). <br/>
     * TODO(这里描述这个方法适用条件 – 可选).<br/>
     * @param key
     * @param liveTime
     * @return
     * @author monxz
     * @time:2019年9月9日上午5:59:38
     * @since JDK 1.8
     */
    Long incr(String key, long liveTime, Integer defaultValue);


    /**
     * 获取失效时间
     * getExpireTime:(这里用一句话描述这个方法的作用). <br/>
     * TODO(这里描述这个方法适用条件 – 可选).<br/>
     * @param key
     * @return
     * @author monxz
     * @time:2019年9月9日上午6:10:48
     * @since JDK 1.8
     */
    Long getExpireTime(String key);

    /**
     * 模糊查询
     * parmGet:(这里用一句话描述这个方法的作用). <br/>
     * TODO(这里描述这个方法适用条件 – 可选).<br/>
     * @param key
     * @return
     * @author monxz
     * @time:2019年10月26日上午6:15:09
     * @since JDK 1.8
     */
    <T> List<T>  parmGet(String key);

    /**
     * 返回生效时间和对应的value
     * getLiveTimeAndT:(这里用一句话描述这个方法的作用). <br/>
     * TODO(这里描述这个方法适用条件 – 可选).<br/>
     * @param key
     * @return
     * @author monxz
     * @time:2019年10月26日上午6:15:57
     * @since JDK 1.8
     */
    <T> Map<Long, T>  getLiveTimeAndValue(String key);

    /**
     * 续期
     * delyLiveTime:(这里用一句话描述这个方法的作用). <br/>
     * TODO(这里描述这个方法适用条件 – 可选).<br/>
     * @param key
     * @param secs
     * @author monxz
     * @time:2019年10月26日上午6:27:39
     * @since JDK 1.8
     */
    void   delyLiveTime(String key, Long secs);
}

